package com.zxf.crypt.util;

import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.crypto.symmetric.AES;
import cn.hutool.crypto.symmetric.DES;
import cn.hutool.crypto.symmetric.DESede;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;

/**
 * 加密解密工具
 *
 * @author zxf
 */
public class CryptUtil {

    /**
     * 对字符串使用 MD5 加密方式加密
     *
     * @param text 明文
     * @return MD5 密文
     **/
    public static String encryptMd5(String text) {
        return DigestUtil.md5Hex(text);
    }


    /**
     * 对字符串使用 DES 加密方式加密
     *
     * @param bytes   明文
     * @param DES_KEY 使用 DES 方式加密的KEY
     * @return DES 密文
     **/
    public static String encryptDES(byte[] bytes, String DES_KEY) {
        DES des = SecureUtil.des(SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue(), DES_KEY.getBytes()).getEncoded());
        return des.encryptHex(bytes);
    }

    /**
     * 对字符串使用 DES 加密方式加密
     *
     * @param text    明文
     * @param DES_KEY 使用 DES 方式加密的KEY
     * @return DES 密文
     **/
    public static String encryptDES(String text, String DES_KEY) {
        DES des = SecureUtil.des(SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue(), DES_KEY.getBytes()).getEncoded());
        return des.encryptHex(text);
    }

    /**
     * 对字符串使用 DES 解密
     *
     * @param hex     密文
     * @param DES_KEY 使用 DES 方式加密的KEY
     * @return DES 明文
     **/
    public static String decryptDES(String hex, String DES_KEY) {
        DES des = SecureUtil.des(SecureUtil.generateKey(SymmetricAlgorithm.DES.getValue(), DES_KEY.getBytes()).getEncoded());
        return des.decryptStr(hex);
    }

    /**
     * 对字符串使用 3DES 加密方式加密
     *
     * @param text      明文
     * @param DES_3_KEY 使用 3DES 方式加密的KEY
     * @return 3DES 密文
     **/
    public static String encryptDES_3(String text, String DES_3_KEY) {
        DESede deSede = SecureUtil.desede(SecureUtil.generateKey(SymmetricAlgorithm.DESede.getValue(), DES_3_KEY.getBytes()).getEncoded());
        return deSede.encryptHex(text);
    }

    /**
     * 对字符串使用 3DES 加密方式解密
     *
     * @param hex       密文
     * @param DES_3_KEY 使用 3DES 方式加密的KEY
     * @return 明文
     **/
    public static String decryptDES_3(String hex, String DES_3_KEY) {
        DESede deSede = SecureUtil.desede(SecureUtil.generateKey(SymmetricAlgorithm.DESede.getValue(), DES_3_KEY.getBytes()).getEncoded());
        return deSede.decryptStr(hex);
    }


    /**
     * 对字符串使用 AES 加密方式加密
     *
     * @param text    明文
     * @param AES_KEY 使用 AES 方式加密的KEY
     * @return AES 密文
     **/
    public static String encryptAES(String text, String AES_KEY) {
        AES aes = SecureUtil.aes(SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue(), AES_KEY.getBytes()).getEncoded());
        return aes.encryptHex(text);
    }

    /**
     * 对字符串使用 AES 解密方式解密
     *
     * @param hex     密文
     * @param AES_KEY 使用 AES 方式加密的KEY
     * @return AES 明文
     **/
    public static String decryptAES(String hex, String AES_KEY) {
        AES aes = SecureUtil.aes(SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue(), AES_KEY.getBytes()).getEncoded());
        return aes.decryptStr(hex);
    }

    /**
     * RSA 公钥加密
     *
     * @param text       要加密的内容
     * @param PUBLIC_KEY 公钥
     */
    public static String encryptRSA(String text, String PUBLIC_KEY) {
        try {
            RSA rsa = new RSA(null, PUBLIC_KEY);
            return rsa.encryptBase64(text, KeyType.PublicKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * RSA私钥解密
     *
     * @param text        要解密的内容
     * @param PRIVATE_KEY 私钥
     */
    public static String decryptRSA(String text, String PRIVATE_KEY) {
        try {
            RSA rsa = new RSA(PRIVATE_KEY, PRIVATE_KEY);
            return rsa.decryptStr(text, KeyType.PrivateKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}
